package com.fc.entities;

import javax.persistence.CascadeType
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.JoinTable
import javax.persistence.ManyToOne
import javax.persistence.OneToMany
import javax.persistence.Table
import javax.validation.constraints.Max
import javax.validation.constraints.Min
import javax.validation.constraints.NotNull
import javax.validation.constraints.Size

import org.hibernate.annotations.Fetch
import org.hibernate.annotations.FetchMode

/**
 * 
 * @author Ács Ádám
 *
 */
@Entity
@Table(name = "Recipe")
class Recipe extends BaseEntity{
	@Column(name = "name")
	@NotNull
	@Size(min=3, max=64)
	String name

	@Column(name = "preparationRating")
	@Max(5L)
	int preparationRating

	@Column(name = "priceRating")
	@Max(5L)
	int priceRating

	@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
	@JoinTable(name = "Recipe_RecipeEntries", joinColumns = [ @JoinColumn(name = "recipe_id", referencedColumnName="id") ], inverseJoinColumns = [ @JoinColumn(name = "RecipeEntry_id", referencedColumnName="id") ])
	@Fetch (FetchMode.SELECT)
	List<RecipeEntry> ingredients = new ArrayList<RecipeEntry>()	

	@Column(name = "description", length = 12000)
	@NotNull
	@Size(max = 12000)
	String description
	
	@Column(name="dose")
	@Min(1L)
	@Max(100L)
	@NotNull
	Integer dose
	
	@ManyToOne
	@NotNull
	User user

	/**
	 * a hozzávalókból számított kalória érték
	 * @return
	 */
	int getSumCalorie() {
		int sum = 0
		for (entry in ingredients) {
			sum += entry.food.calorie * (entry.quantity / entry.food.quantity)
		}
		return sum
	}
	
	/**
	 * a hozzávalókból számított fehérje érték
	 * @return
	 */
	int getSumProtein() {
		int sum = 0
		for (entry in ingredients) {
			sum += (entry.food.protein * (entry.quantity / entry.food.quantity))
		}
		return sum
	}
	
	/**
	 * a hozzávalókból számított szénhidrát érték
	 * @return
	 */
	int getSumCarbohydrate() {
		int sum = 0
		for (entry in ingredients) {
			sum += (entry.food.carbohydrate * (entry.quantity / entry.food.quantity))
		}
		return sum
	}
	
	/**
	 * a hozzávalókból számított rost érték
	 * @return
	 */
	int getSumFiber() {
		int sum = 0
		for (entry in ingredients) {
			sum += (entry.food.fiber * (entry.quantity / entry.food.quantity))
		}
		return sum
	}

	/**
	 * a hozzávalókból számított zsír érték
	 * @return
	 */
	int getSumFat() {
		int sum = 0
		for (entry in ingredients) {
			sum += (entry.food.fat * (entry.quantity / entry.food.quantity))
		}
		return sum
	}
	
	@Override
	String toString() {
		return name;
	}

	@Override
	boolean equals(Object other) {
		return (other instanceof Recipe) && (id != null) ? id.equals(((Recipe) other).id) : (other == this);
	}

	@Override
	int hashCode() {
		return (id != null)	? (this.getClass().hashCode() + id.hashCode())	: super.hashCode();
	}
}
